/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

#include "STC8G_H_GPIO.h"

//========================================================================
// 函数: u8	GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
// 描述: 初始化IO口.
// 参数: GPIOx: 结构参数,请参考timer.h里的定义.
// 返回: 成功返回 SUCCESS, 错误返回 FAIL.
// 版本: V1.0, 2012-10-22
//========================================================================
u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
{
    if (GPIO > GPIO_P7)
        return FAIL;  //错误
    if (GPIOx->Mode > GPIO_OUT_PP)
        return FAIL;  //错误
    if (GPIO == GPIO_P0) {
        if (GPIOx->Mode == GPIO_PullUp)
            P0M1 &= ~GPIOx->Pin, P0M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P0M1 |= GPIOx->Pin, P0M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P0M1 |= GPIOx->Pin, P0M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P0M1 &= ~GPIOx->Pin, P0M0 |= GPIOx->Pin;  //推挽输出
    }
    if (GPIO == GPIO_P1) {
        if (GPIOx->Mode == GPIO_PullUp)
            P1M1 &= ~GPIOx->Pin, P1M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P1M1 |= GPIOx->Pin, P1M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P1M1 |= GPIOx->Pin, P1M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P1M1 &= ~GPIOx->Pin, P1M0 |= GPIOx->Pin;  //推挽输出
    }
    if (GPIO == GPIO_P2) {
        if (GPIOx->Mode == GPIO_PullUp)
            P2M1 &= ~GPIOx->Pin, P2M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P2M1 |= GPIOx->Pin, P2M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P2M1 |= GPIOx->Pin, P2M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P2M1 &= ~GPIOx->Pin, P2M0 |= GPIOx->Pin;  //推挽输出
    }
    if (GPIO == GPIO_P3) {
        if (GPIOx->Mode == GPIO_PullUp)
            P3M1 &= ~GPIOx->Pin, P3M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P3M1 |= GPIOx->Pin, P3M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P3M1 |= GPIOx->Pin, P3M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P3M1 &= ~GPIOx->Pin, P3M0 |= GPIOx->Pin;  //推挽输出
    }
    if (GPIO == GPIO_P4) {
        if (GPIOx->Mode == GPIO_PullUp)
            P4M1 &= ~GPIOx->Pin, P4M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P4M1 |= GPIOx->Pin, P4M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P4M1 |= GPIOx->Pin, P4M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P4M1 &= ~GPIOx->Pin, P4M0 |= GPIOx->Pin;  //推挽输出
    }
    if (GPIO == GPIO_P5) {
        if (GPIOx->Mode == GPIO_PullUp)
            P5M1 &= ~GPIOx->Pin, P5M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P5M1 |= GPIOx->Pin, P5M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P5M1 |= GPIOx->Pin, P5M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P5M1 &= ~GPIOx->Pin, P5M0 |= GPIOx->Pin;  //推挽输出
    }
    if (GPIO == GPIO_P6) {
        if (GPIOx->Mode == GPIO_PullUp)
            P6M1 &= ~GPIOx->Pin, P6M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P6M1 |= GPIOx->Pin, P6M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P6M1 |= GPIOx->Pin, P6M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P6M1 &= ~GPIOx->Pin, P6M0 |= GPIOx->Pin;  //推挽输出
    }
    if (GPIO == GPIO_P7) {
        if (GPIOx->Mode == GPIO_PullUp)
            P7M1 &= ~GPIOx->Pin, P7M0 &= ~GPIOx->Pin;  //上拉准双向口
        if (GPIOx->Mode == GPIO_HighZ)
            P7M1 |= GPIOx->Pin, P7M0 &= ~GPIOx->Pin;  //浮空输入
        if (GPIOx->Mode == GPIO_OUT_OD)
            P7M1 |= GPIOx->Pin, P7M0 |= GPIOx->Pin;  //开漏输出
        if (GPIOx->Mode == GPIO_OUT_PP)
            P7M1 &= ~GPIOx->Pin, P7M0 |= GPIOx->Pin;  //推挽输出
    }
    return SUCCESS;  //成功
}
